package Soligee.model.vo.cadastros;

import Soligee.model.vo.lancamentos.VendaVO;
import java.io.IOException;
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.*;
import org.hibernate.annotations.CascadeType;
import java.util.Date;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "pessoa")
@Inheritance(strategy = InheritanceType.JOINED)
public class PessoaVO implements Serializable {

    @Id
    @SequenceGenerator(name = "cod_pessoa", sequenceName = "cod_pessoa_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cod_pessoa")
    @Column(name = "cod_pessoa")
    private int codPessoa;

    @Column(name = "nome")
    private String nome;

    @Column(name = "telefone_um" )
    private String telefoneDois;

    @Column(name = "telefone_dois")
    private String telefoneUm;

    @Column(name = "email")
    private String email;

    @Column(name = "data_cadastro")
    @Temporal(TemporalType.DATE)
    private Date dataCadastro;

    @Column(name = "pagina_web")
    private String paginaWeb;

    @Column(name = "imagem",insertable=false, updatable=false)
    private byte[] imagem;

    @Column(name = "ativo")
    private boolean ativo;

    @OneToMany(mappedBy = "pessoa", fetch = FetchType.EAGER, cascade={javax.persistence.CascadeType.MERGE, javax.persistence.CascadeType.PERSIST})
    @Cascade(CascadeType.LOCK)
    @Fetch(FetchMode.SELECT)
    private Collection<EnderecoVO> endereco;

    @OneToMany(mappedBy="pessoa", fetch = FetchType.LAZY)
    @Cascade(CascadeType.LOCK)
    private Collection<VendaVO> venda;

    public PessoaVO() {//consturtor vazio necessario para o hibernate
      
    }
    //contrutor com parametros

    public PessoaVO(int codPessoa, String nome, String telefoneUm, String telefoneDois, String email, String paginaWeb, String caminhoImagem, Date dataCadastro)
            throws IOException, IllegalStateException {
        try {
            this.setCodPessoa(codPessoa);
            this.setNome(nome);
            this.setEmail(email);
            this.setPaginaWeb(paginaWeb);
            this.setImagem(caminhoImagem);
            this.setTelefoneUm(telefoneUm);
            this.setTelefoneDois(telefoneDois);
            this.setDataCadastro(dataCadastro);
            this.setAtivo(true);
        } catch (IllegalStateException il) {
            System.err.println("Excecao:" + il.getMessage()+il.getStackTrace());
        } catch (IOException io) {
            System.err.println("Excecao:" + io.getMessage()+io.getStackTrace());
        }
    }

    public int getCodPessoa() {
        return codPessoa;
    }

    public void setCodPessoa(int codPessoa) {
        this.codPessoa = codPessoa;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    public String getPaginaWeb() {
        return paginaWeb;
    }

    public void setPaginaWeb(String paginaWeb) {
        this.paginaWeb = paginaWeb;
    }

    public byte[] getImagem() {
        return imagem;
    }

    public void setImagem(String caminhoImagem) throws IOException {
        this.imagem = this.imageToBytes(caminhoImagem);
    }

    //metodo necessario para transformar a imagem em byte[]    
    public byte[] imageToBytes(String caminhoArquivo) throws IOException {
       /*InputStream is = new FileInputStream(caminhoArquivo);
        byte[] buffer = new byte[is.available()];
        is.read(buffer);
        is.close();*/
        return null;
    }

    public Collection<EnderecoVO> getEndereco() {
        return endereco;
    }

    public void setEndereco(Collection<EnderecoVO> endereco) {
        this.endereco = endereco;
    }

    public String getTelefoneDois() {
        return telefoneDois;
    }

    public void setTelefoneDois(String telefoneDois) {
        this.telefoneDois = telefoneDois;
    }

    public String getTelefoneUm() {
        return telefoneUm;
    }

    public void setTelefoneUm(String telefoneUm) {
        this.telefoneUm = telefoneUm;
    }

    public boolean isAtivo() {
        return ativo;
    }

    public void setAtivo(boolean ativo) {
        this.ativo = ativo;
    }

    public Collection<VendaVO> getVenda() {
        return venda;
    }

    public void setVenda(Collection<VendaVO> venda) {
        this.venda = venda;
    }



}